D8 a marshaling "char**"

Otázka od: Lukas Gebauer

15. 7. 2004 10:58


Mam problem...
Z D8 pres PInvoke volam nejake DLLka.

Pokud je parametr typu "char*", tak to uspesne zmarshaluju pres
string a stringbuilder.

Jen si nevim rady co si pocit s typem "char**". Ve starych delphi
staci pouzit "var pchar". Jak to ale udelat v D8?

Dik za jakekoliv napady a nakopnuti.

--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Lukas Gebauer

19. 7. 2004 8:05

> Z D8 pres PInvoke volam nejake DLLka.
>
> Jen si nevim rady co si pocit s typem "char**". Ve starych delphi
> staci pouzit "var pchar". Jak to ale udelat v D8?

Odpovim si sam:

Zatimco "char*" se vyrobi sam z typu String, pripadne ze
StringBuilder pro vystupni parametry, tak u "char**" se na to musi
jit trosku jinak:

Je potreba deklarovat takovy parametr jako "var x:IntPtr", tedy jako
odkaz na IntPtr. To je typove presne to co chceme. Jen musime rucne
prevadet retezec na IntPtr, pripadne zpet z IntPtr na retezec pro
vystupni parametry.

Klicove funkce jsou: Marshal.StringToHGlobalAnsi,
Marshal.AllocHGlobal, Marshal.PtrToStringAnsi.

Hlavne nezapomenout po sobe uklizet alokovanou pamet (garbage
collection tady logicky nefunguje!) pomoci Marshal.FreeHGlobal.



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.